package eu.hellek.gba.server.rpc; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import com.google.gwt.user.server.rpc.RemoteServiceServlet; import eu.hellek.gba.client.ListPointsService; import eu.hellek.gba.model.Point; import eu.hellek.gba.server.dao.Dao; import eu.hellek.gba.server.utils.Utils; import eu.hellek.gba.shared.SearchResultProxy; @SuppressWarnings("serial") public class ListPointsServiceImpl extends RemoteServiceServlet implements ListPointsService { // private static final int maxRequestsDirect = 30; public static final int maxRequestsDirect = 100; public static final int maxRequestsIndirect = maxRequestsDirect; // private static final int maxRequestsIndirect = maxRequestsDirect/2; @Override public SearchResultProxy getDirectConnections(float lat1, float lon1, float lat2, float lon2, boolean ignoreTrains, boolean ignoreSubte) throws IllegalArgumentException { final String functionName = "getDirectConnections()"; // System.err.println("Session cookie: " + getThreadLocalRequest().getSession().getId()); double distanceBetweenPoints = Utils.distanceInMeters(new Point("", lat1, lon1, null), new Point("", lat2, lon2, null)); if(distanceBetweenPoints > 1000) { int requests = 0; if(getThreadLocalRequest() != null && getThreadLocalRequest().getSession() != null && getThreadLocalRequest().getSession().getId() != null) { requests = Dao.getInstance().addAndCheckSearchForIp(getThreadLocalRequest().getSession().getId(), 0); } else { requests = Dao.getInstance().addAndCheckSearchForIp(getThreadLocalRequest().getRemoteAddr(), 0); } if(requests < maxRequestsDirect) { return new ExtractedFunctions().getDirectConnections(lat1, lon1, lat2,lon2,ignoreTrains, ignoreSubte, this.getThreadLocalRequest().getRemoteAddr()); } else { Logger.getLogger("ListPointsServiceImpl").log(Level.WARNING, functionName + ": too many requests for ip " + getThreadLocalRequest().getRemoteAddr() + ": " + requests); return new SearchResultProxy(SearchResultProxy.tooManyReqests, null, null); } } else { Logger.getLogger("ListPointsServiceImpl").log(Level.INFO, functionName + ": distance too little " + distanceBetweenPoints); return new SearchResultProxy(SearchResultProxy.distanceTooLittle, null, null); } } @Override public SearchResultProxy getIndirectConnections(float lat1, float lon1, float lat2, float lon2, boolean ignoreTrains, boolean ignoreSubte, List<String> mlkSet1String, List<String> mlkSet2String) throws IllegalArgumentException { final String functionName = "getIndirectConnections()"; double distanceBetweenPoints = Utils.distanceInMeters(new Point("", lat1, lon1, null), new Point("", lat2, lon2, null)); if(distanceBetweenPoints > 1000) { int requests = 0; if(getThreadLocalRequest() != null && getThreadLocalRequest().getSession() != null && getThreadLocalRequest().getSession().getId() != null) { requests = Dao.getInstance().addAndCheckSearchForIp(getThreadLocalRequest().getSession().getId(), 1); } else { requests = Dao.getInstance().addAndCheckSearchForIp(getThreadLocalRequest().getRemoteAddr(), 1); } if(requests < maxRequestsIndirect) { return new ExtractedFunctions().getIndirectConnections(lat1, lon1, lat2, lon2, ignoreTrains, ignoreSubte, mlkSet1String, mlkSet2String); } else { Logger.getLogger("ListPointsServiceImpl").log(Level.WARNING, functionName + ": too many requests for ip " + getThreadLocalRequest().getRemoteAddr() + ": " + requests); return new SearchResultProxy(SearchResultProxy.tooManyReqests, null, null); } } else { Logger.getLogger("ListPointsServiceImpl").log(Level.INFO, functionName + ": distance too little " + distanceBetweenPoints); return new SearchResultProxy(SearchResultProxy.distanceTooLittle, null, null); } } }